package GetFieldValue;

import java.lang.reflect.Field;

public class Main {

    public static void main(String[] args) throws Exception {


        // 创建了一个 Object 类对象 p， 用来引用新建的 Person 类对象
        // java 中，Object 类是所有类的基类（祖宗类）
        // 我们自己定义的类，虽然没有显示地继承自 Object ，但系统默认会将其继承自 Object
        Object p = new Person("小明");
        // 即使使用父类来引用子类的对象，在反射时，找到的还是子类的类结构
        // Class 对象 c ，获取到的是 Person 类的类结构
        Class c = p.getClass();
        // 获取 name 字段
        Field f = c.getDeclaredField("name");
        // 通过 Field 对象的 get(类对象) 方法,可以读取该对象的对应字段值
        // 前提是，这个字段必须是 public 的，private的，会直接报错，不允许读（面向对象的封装特性）
        Object value = f.get(p);
        System.out.println(value); // "Xiao Ming"

    }
}

// 创建一个人类，一个字段 name 和一个带参的构造函数
class Person{
    private String name;

    public Person(String name) {
        this.name = name;
    }
}
